prompt = """
任务目标
你需要作为 “人机交互可回复性判断器”，针对用户在人机交互场景（如智能助手、客服机器人、对话类 APP 等）中输入的文本，判断该文本是否适合 AI 进行回应，并给出 1-10 分的 “可回复性分数”（1 分最低，10 分最高）。打分后需附带简短理由，说明分数对应的判断依据。
核心判断维度
在打分前，需从以下 4 个维度综合评估，确保判断贴合人机交互实际需求：
需求明确性：文本是否包含明确的用户意图（如提问、请求帮助、寻求信息、表达需求等），而非无意义的碎片化内容；
语义完整性：文本是否语义通顺、无严重歧义，AI 能否准确理解核心信息（避免因文本模糊导致无法定位回应方向）；
回应必要性：文本是否需要 AI 给出反馈（如 “问问题” 需要解答、“提需求” 需要响应，而非纯个人情绪宣泄或无互动意图的陈述）；
互动延伸性：文本是否支持 AI 进一步回应（如 “帮我推荐餐厅” 可追问口味偏好，而非 “我吃饭了” 这类无需后续互动的内容）。
分数分级标准（1-10 分）
1-2 分：完全不可回复
定义：文本无实际语义、无互动需求，AI 无法定位回应方向，或回应无任何交互价值；
典型场景：无意义字符 / 乱码、纯情绪宣泄（无互动意图）、无语义的短句；
示例参考：“啊啊啊”“呃呃呃”“fdsgjhkl”“烦死了（无后续）”。
3-5 分：低可回复（需 AI 勉强回应，互动价值低）
定义：文本有基础语义，但需求模糊、无明确互动意图，或 AI 只能给出 “无针对性” 的回应（如 “嗯”“好的”）；
典型场景：纯陈述性短句（无互动需求）、语义模糊的表达、无明确指向的感慨；
示例参考：“今天天气不错”“我刚看完电影”“这东西有点难”“随便吧”。
6-8 分：高可回复（AI 可精准回应，满足基础互动需求）
定义：文本有明确需求 / 意图，语义完整无歧义，AI 能直接提供针对性回应（如解答问题、满足请求、给出建议）；
典型场景：明确提问、具体需求、可直接响应的请求；
示例参考：“怎么连接家里的 WiFi？”“帮我查一下明天北京的天气”“这个软件怎么卸载？”“推荐一本悬疑类小说”。
9-10 分：最优可回复（AI 可深度回应，支持延伸互动）
定义：文本需求明确、语义完整，且 AI 不仅能直接回应，还能基于文本进一步追问 / 细化需求，形成持续互动；
典型场景：包含 “可细化维度” 的需求、需要 AI 补充信息的请求、支持多轮对话的提问；
示例参考：“帮我规划从上海到杭州 2 天的旅游路线，偏好自然景点”（可追问是否需要包含住宿推荐）、“想学习 Python，零基础应该从哪本书开始？”（可追问学习目标：办公自动化 / 数据分析等）、“我的手机充电很慢，可能是什么原因？”（可追问手机型号 / 充电方式等）。
示例演示（输入文本 + 分数 + 理由）
输入文本：“qwertyuiop”
分数：<1> 分
理由：无意义字符，无语义、无互动需求，AI 无法定位回应方向，完全不可回复。
输入文本：“我今天加班到很晚”
分数：<4> 分
理由：纯陈述性内容，无明确互动意图（如未提问、未提需求），AI 只能回应 “辛苦了” 等无针对性内容，互动价值低，属于低可回复。
输入文本：“MacBook 怎么清理系统缓存？”
分数：<7> 分
理由：需求明确（清理系统缓存）、语义完整，AI 可直接给出具体操作步骤，能满足用户核心需求，属于高可回复。
输入文本：“想给朋友买生日礼物，预算 500 元以内，他喜欢运动，推荐什么？”
分数：<10> 分
理由：需求明确（推荐 500 元内运动类礼物），且 AI 可进一步追问 “朋友喜欢的运动类型（如跑步 / 篮球 / 健身）” 来细化推荐，支持多轮互动，属于最优可回复。
输出格式要求
对每段用户输入文本，需按以下格式输出：注意，分数用< > 包裹，已方便后续分数提取，同时不要生成换行符。
分数：<1-10> 分
理由：[结合 “核心判断维度” 和 “分数分级标准”，说明分数依据，1-2 句话即可]
-------------
输入内容为：{}
请回答：
"""
import utils_file
import re
def extract_content_regex(s: str):
    """
    使用正则表达式从格式为 '前缀<内容>' 的字符串中提取前缀和内容。

    参数:
        s (str): 输入的字符串。

    返回:
        tuple: 一个包含两个元素的元组 (前缀, 内容)。如果匹配失败，返回 (None, None)。
    """
    # 定义正则表达式模式
    pattern = r'^(.*?)<(.*?)>$'

    # 使用 re.match 进行匹配，它会从字符串的开头开始匹配
    match = re.match(pattern, s)

    if match:
        # 如果匹配成功，group(1) 是第一个捕获组（前缀），group(2) 是第二个捕获组（内容）
        return match.group(1), '<' + match.group(2) + '>'
    else:
        # 如果匹配失败
        print(f"警告：输入字符串 '{s}' 与模式不匹配。")
        return None, None


def extract_number_from_string(text):
    """
    从字符串中提取第一个<N>格式的数字N。

    参数:
        text (str): 输入的字符串。

    返回:
        int or None: 提取到的整数，如果未找到则返回None。
    """
    # 定义正则表达式模式
    pattern = r'<(\d+)>'

    # 在文本中搜索匹配项
    match = re.search(pattern, text)

    # 判断是否找到了匹配项
    if match:
        # group(1) 获取第一个捕获组的内容，也就是括号里的数字字符串
        number_str = match.group(1)
        # 将字符串转换为整数并返回
        return int(number_str)
    else:
        # 如果没有找到匹配的模式
        return None


# scorce_file = "/apdcephfs_qy3/share_976139/users/xuelonggeng/data/emotion_data/ft_local/score.list"
# score_dict = {}
# info_dict_list = utils_file.load_dict_list_from_jsonl(scorce_file)
# for dict_info in info_dict_list:
#     key = dict_info['key']
#     score_txt = dict_info['score']
#     score_int = extract_content_regex(score_txt)
#     score_dict[key] = score_int
# 1. 导入所需库
def do_plot_score():
    from collections import Counter
    import matplotlib.pyplot as plt

    output_file = "/apdcephfs_qy3/share_976139/users/xuelonggeng/data/emotion_data/ft_local/score_int.scp"
    # utils_file.write_dict_to_scp(score_dict, output_file)
    #
    # print(extract_number_from_string('分数：<4> 分；理由：纯陈述性短句，无明确互动意图或需求，AI 只能回应 “OK” 等无针对性内容，互动价值低，属于低可回复。'))

    real_dict = utils_file.load_dict_from_scp(output_file)

    # 3. 提取非None的num值，形成列表
    num_list = [val for val in real_dict.values() if val is not None and str(val) != "None"]

    # 4. 统计频次并按数字升序排序
    freq_counter = Counter(num_list)
    sorted_items = sorted(freq_counter.items(), key=lambda x: int(x[0]))  # 按数字排序：[(1,1), (2,2), ...]
    numbers, frequencies = zip(*sorted_items)  # 拆分数字和频次列表

    # 5. 绘制柱状图（先获取柱子对象，用于后续标注）
    bars = plt.bar(numbers, frequencies, color='lightcoral', edgecolor='darkred', linewidth=0.8)

    # 6. 循环为每个柱子标注具体数值
    for bar, freq in zip(bars, frequencies):
        # 获取柱子的位置和高度：x为柱子中心，y为柱子顶部
        x_pos = bar.get_x() + bar.get_width() / 2  # 柱子水平中心
        y_pos = bar.get_height() + 0.1  # 柱子顶部+0.1（避免紧贴柱子）

        # 添加数值标签：居中显示，字体大小10
        plt.text(
            x=x_pos,
            y=y_pos,
            s=str(freq),  # 要显示的数值（转字符串避免格式问题）
            ha='center',  # 水平居中
            va='bottom',  # 垂直靠下（基于y_pos）
            fontsize=10,
            fontweight='bold'  # 数值加粗，更清晰
        )

    # 7. 图表基础配置
    plt.title('Distribution of Numbers (1-10)', fontsize=14, pad=15)
    plt.xlabel('Number', fontsize=12)
    plt.ylabel('Frequency', fontsize=12)
    plt.xticks(numbers)  # x轴刻度与数字完全对应

    # 8. 保存图片（避免显示，直接生成文件）
    plt.savefig('num_distribution_with_values.png', dpi=300, bbox_inches='tight')
    print("Chart saved as 'num_distribution_with_values.png'")


def main_get_remain_part_of_asr6_4W():
    """"""
    input_full_path = "/teaspeech_ceph/share_976139/users/xuelonggeng/data/asr_6.4w/text"
    haved_dir = "/teaspeech_ceph/share_976139/users/xuelonggeng/data/asr_6.4w/tmp"
    jsonl_files_path_list = utils_file.do_get_list_for_wav_dir(haved_dir, suffix=".jsonl")
    haved_key_set = set()
    for jsonl_file in utils_file.tqdm(jsonl_files_path_list):
        """"""
        data_list_i = utils_file.load_dict_list_from_jsonl(jsonl_file)
        for data in data_list_i:
            key = data['key']
            if key not in haved_key_set:
                haved_key_set.add(key)
    print("已完成的 key数量",len(haved_key_set))
    remain_file_path = "/teaspeech_ceph/share_976139/users/xuelonggeng/data/asr_6.4w/text_remain_stage2.scp"
    full_txt_dict = utils_file.load_dict_from_scp(input_full_path)
    print("原始文本数量",len(full_txt_dict))
    new_txt_dict = {}
    for key, txt in full_txt_dict.items():
        if key not in haved_key_set:
            new_txt_dict[key] = txt
    print(f'剩余文本数量：{len(new_txt_dict)}')
    utils_file.write_dict_to_scp(new_txt_dict, remain_file_path)


def main_get_remain_stage3_part_of_asr6_4W():
    """"""
    stage2_full_path = "/apdcephfs_qy3/share_976139/users/xuelonggeng/data/asr_6.4w/text_remain_stage2.scp"
    remain_file_path = "/teaspeech_ceph/share_976139/users/xuelonggeng/data/asr_6.4w/text_remain_stage3.scp"
    haved_key_set = set()
    for i in range(1,4):
        haved_dir = f"/teaspeech_ceph/share_976139/users/xuelonggeng/data/asr_6.4w/tmp_{i}"
        print(haved_dir)
        jsonl_files_path_list = utils_file.do_get_list_for_wav_dir(haved_dir, suffix=".jsonl")
        for jsonl_file in utils_file.tqdm(jsonl_files_path_list):
            """"""
            data_list_i = utils_file.load_dict_list_from_jsonl(jsonl_file)
            for data in data_list_i:
                key = data['key']
                if key not in haved_key_set:
                    haved_key_set.add(key)
        print(f"continue, dir{i}, 已完成的 key数量{len(haved_key_set)}")
    print("finish, 已完成的 key数量",len(haved_key_set))
    full_txt_dict = utils_file.load_dict_from_scp(stage2_full_path)
    print("原始文本数量",len(full_txt_dict))
    new_txt_dict = {}
    for key, txt in full_txt_dict.items():
        if key not in haved_key_set:
            new_txt_dict[key] = txt
    print(f'剩余文本数量：{len(new_txt_dict)}')
    utils_file.write_dict_to_scp(new_txt_dict, remain_file_path)


def main_do_split3_for_remain():
    """"""
    remain_file_path = "/teaspeech_ceph/share_976139/users/xuelonggeng/data/asr_6.4w/text_remain_stage2.scp"
    lines = utils_file.load_list_file_clean(remain_file_path)
    lines_split3_list = utils_file.do_split_list(lines, 3)
    for i in range(3):
        output_path_i = f"/teaspeech_ceph/share_976139/users/xuelonggeng/data/asr_6.4w/text_remain_stage2_split{i+1}.scp"
        print(f'output_path_i = {output_path_i}')
        utils_file.write_list_to_file(lines_split3_list[i], output_path_i)
    print("完成拆分")

def main_do_split6_for_remain():
    """"""
    stage2_full_path = "/apdcephfs_qy3/share_976139/users/xuelonggeng/data/asr_6.4w/text_remain_stage2.scp"
    lines = utils_file.load_list_file_clean(stage2_full_path)
    lines_split3_list = utils_file.do_split_list(lines, 6)
    for i in range(6):
        output_path_i = f"/teaspeech_ceph/share_976139/users/xuelonggeng/data/asr_6.4w/text_remain_stage3_split{i+1}.scp"
        print(f'output_path_i = {output_path_i}')
        utils_file.write_list_to_file(lines_split3_list[i], output_path_i)
    print("完成拆分")

if __name__ == '__main__':
    """"""
    # main_get_remain_stage3_part_of_asr6_4W()
    main_do_split6_for_remain()